package com.huilian.iotbox.admin.service.impl;

import com.huilian.iotbox.admin.dao.RoleDao;
import com.huilian.iotbox.admin.service.RoleService;
import com.huilian.iotbox.data.common.ServerResponse;
import com.huilian.iotbox.data.dto.RoleDto;
import com.huilian.iotbox.data.enums.RoleTypeEnum;
import com.huilian.iotbox.data.po.Role;
import com.huilian.iotbox.data.vo.RoleVo;
import com.huilian.iotbox.data.vo.UserInfo;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 少凡
 * @date 2020/3/1 20:27
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Resource
    private RoleDao roleDao;


    @Override
    public List<Role> findListByAgencyId(UserInfo userInfo, RoleDto roleDto) {
        if (StringUtils.isEmpty(roleDto.getType())){
            throw new RuntimeException("type不能空");
        }

        if (StringUtils.isEmpty(RoleTypeEnum.getRoleType(roleDto.getType()))){
            throw new RuntimeException("type不存在");
        }

        List<Integer> agencyIdList = new ArrayList<>();
        agencyIdList.add(0);
        agencyIdList.add(userInfo.getAgencyId());

        List<Role> list = roleDao.findListByAgencyId(userInfo.getRoleId(), agencyIdList, roleDto.getKeyword(), roleDto.getType());
        return list;
    }

    @Override
    public ServerResponse update(Role role) {

        Integer result = roleDao.update(role);

        if (result == 1) {
            return ServerResponse.createByErrorMessage("角色更新成功！");
        } else {
            return ServerResponse.createByErrorMessage("角色更新失败！");
        }
    }

    @Override
    public ServerResponse delete(Integer id) {

        Integer result = roleDao.delete(id);

        if (result == 1) {
            return ServerResponse.createBySuccess("角色更新成功！");
        } else {
            return ServerResponse.createByErrorMessage("角色更新失败！");
        }
    }

    @Override
    public ServerResponse add(Role role) {

        /**
         * 公有角色存在，每个机构都不可以创建一个相同名称的私有角色
         * 机构已创建私有角色，每个机构不能创建相同名称的公有角色
         * 机构内角色名称不能重名，但是机构之间角色名称可以相同且每个机构只能一个
         */

        List<Role> isExistRoleList = roleDao.findAllRoleByName(role.getName());
        // 公共角色名称只能创建一个
        if (role.getAgencyId() == 0 && isExistRoleList.size() > 0){
            return ServerResponse.createByErrorMessage("公共角色名称只能创建一个！");
        }

        for (int i = 0; i < isExistRoleList.size(); i++) {
            Role isExistRole = isExistRoleList.get(i);
            // 同一个机构下不能创建相同名称的角色
            if (isExistRole.getAgencyId().equals(role.getAgencyId())){
                return ServerResponse.createByErrorMessage("同一个机构下不能创建相同名称的角色！");
            }

            if (isExistRole.getAgencyId() == 0){
                return ServerResponse.createByErrorMessage(role.getName() + "，该角色名称已被注册公共角色！");
            }
        }

        int result = roleDao.insert(role);
        if (result == 1) {
            return ServerResponse.createBySuccess("添加角色成功！", null);
        } else {
            return ServerResponse.createByErrorMessage("添加角色失败！");
        }
    }

    @Override
    public ServerResponse assignRoles(UserInfo userInfo, String userId) {

        List<RoleVo> list = roleDao.findAllRoleByAssign(userInfo);
        return ServerResponse.createBySuccess(list);
    }

    @Override
    public List<Role> getUserRoleList(Integer userId) {
        return roleDao.getUserRoleList(userId);
    }

    @Override
    public Role getById(Integer roleId) {
        return roleDao.getById(roleId);
    }

    @Override
    public List<Role> getRoleByAgencyId(RoleVo roleVo) {

        return roleDao.getRoleByAgencyId(roleVo);
    }
}
